/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */

// 导入数据库
const db = require('../db/index')
// 导入token包
const jwt = require('jsonwebtoken')
// 导入加密的配置
const config = require('../config.js')
// 导入加密的包
const bcrypt = require('bcryptjs')

// 注册用户的处理函数
exports.regUser = (req, res) => {
    // 接收表单数据
    const userinfo = req.body
    // 判断数据是否合法
    if (!userinfo.username || !userinfo.password) {
        return res.send({ status: 1, message: '用户名或密码不能为空！' })
    }
    // 定义sql查询语句
    const sqlSelect = `select * from db_user where username=?`
    //查询用户名是否被占用
    db.all(sqlSelect, userinfo.username, (err, results) => {
        //如果发生错误，返回错误信息
        if (err) { return res.send({ status: 1, message: err.message }) }
        //如果返回数组长度大于0，那么用户名被占用，返回错误信息
        if (results.length > 0) { return res.send({ status: 1, message: '用户名被占用，请更换其他用户名！' }) }
        // 对用户的密码,进行 bcrype 加密，返回值是加密之后的密码字符串
        userinfo.password = bcrypt.hashSync(userinfo.password, 10)
        //定义sql插入语句，插入新的用户名以及密码
        const sqlStrInsert = 'insert into db_user (username,password) values ($username,$password)'
        //执行插入新账号密码
        db.run(sqlStrInsert, { $username: userinfo.username, $password: userinfo.password }, (err, results) => {
            //如果发生错误，返回错误信息
            if (err) { return res.send({ status: 1, message: err.message }) }
            //通过以上所有if都没有被return出去，代表注册成功
            res.send({ status: 0, message: '注册成功，请请前往登录！' })
        })



    })


}

// 登录的处理函数
exports.login = (req, res) => {
    // 接收表单数据
    const userinfo = req.body
    // 判断表单数据禁止为空
    if (!userinfo.username || !userinfo.password) {
        return res.send({ status: 1, message: '用户名或密码不能为空！' })
    }
    // 定义 SQL 语句
    const sql = `select * from db_user where username=?`
    // 执行 SQL 语句，查询用户的数据
    db.all(sql, userinfo.username, (err, results) => {
        //如果发生错误，返回错误信息
        if (err) { return res.cc(err.message) }
        // 执行 SQL 语句成功，但是查询到数据条数不等于 1
        if (results.length !== 1) return res.cc('登陆失败，请检查账号是否正确')
        // TODO：判断用户输入的登录密码是否和数据库中的密码一致

        // 拿着用户输入的密码,和数据库中存储的密码进行对比
        const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
        if (!compareResult) return res.cc('登陆失败，请检查密码是否正确')
        // TODO：登录成功，生成 Token 字符串
        // res.cc(0, '登录成功')
        // 剔除完毕之后，user 中只保留了用户的 id, username这四个属性的值
        const usertoken = { ...results[0], password: '' }
        //生成token字符串
        const tokenStr = jwt.sign(usertoken, config.jwtSecretKey, { expiresIn: config.expiresIn })
        //Bearer空格 是固定写法
        res.send({
            status: 0,
            message: '登录成功',
            token: 'Bearer ' + tokenStr,
        })
    })

}

